15. 写入Excel文件

本章概要

  • 学习材料:待导出的明细表、汇总表和目标路径。
  • 本章任务:按“ExcelWriter 上下文管理器”页一次写入多表并回读核验。
  • 完成后你将得到:Excel 文件、工作表清单、行列数与关键单元格。
  • 自我检查:回读后比较字段、行数和关键值;目录不可写或覆盖风险未确认时先检查原因。
  • 拓展练习:把导出过程拓展应用到另一份课程练习文件。

为什么需要将数据导出为Excel?

在金融数据分析和商业智能项目中,数据导出是工作过程程的关键环节:

  • 报告生成:向管理层或客户呈现分析结果
  • 跨部门协作:与非技术人员(如业务部门、财务部门)共享数据
  • 便于核对:保存分析过程的中间结果和最终输出
  • 进一步分析:利用Excel的透视表、图表等功能进行探索性分析

Excel文件格式的技术演进

格式 扩展名 特点 适用场景
XLS .xls Excel 97-2003格式,专有二进制格式 兼容老版本Excel
XLSX .xlsx Excel 2007+格式,基于Open XML标准 现代标准格式
XLSB .xlsb pandas 可读取但不提供标准写入引擎 仅在独立转换工具验证后提供
CSV .csv 纯文本,逗号分隔值 跨平台数据交换

Pandas主要通过 openpyxl 引擎写入XLSX文件,通过 xlsxwriter 引擎实现高级格式化。

数据类型映射:Python → Excel

写入Excel时,Pandas自动进行数据类型转换:

Python类型 Excel类型
int64 数值
float64 数值
datetime64 日期时间
bool 逻辑值(TRUE/FALSE)
str 文本

特殊值处理:NaN 默认写为空单元格;inf 默认写为字符串 inf,也可用 na_rep/inf_rep 显式标记

运行前预测|平台实操:写入Excel文件

  • 输入预测:运行前先写出 datadfstartrowna_rep 的业务含义、数据类型或取值范围,并判断哪一个输入最可能改变结果。
  • 结果预测:不展开答案,先预测将得到na_rep 的结果;同时写出方向、数量级或表格/图形结构。
  • 完成要求:能独立说明本任务从输入到“平台实操:写入Excel文件”结果的关键步骤,原样录入平台代码并得到可核对的运行结果。

⭐ 平台实操:写入Excel文件

展开完整代码(投影默认折叠)
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
import numpy as np  # 导入NumPy数值计算库
import pandas as pd  # 导入Pandas数据分析库
import datetime as dt  # 导入日期时间处理模块

data=[[dt.datetime(2020,1,1, 10, 13), 2.222, 1, True],  # 定义列表data
      [dt.datetime(2020,1,2), np.nan, 2, False],  # 第二行数据(含缺失值NaN)
      [dt.datetime(2020,1,2), np.inf, 3, True]]  # 第三行数据(含无穷大inf)
df = pd.DataFrame(data=data,columns=["Dates", "Floats", "Integers", "Booleans"])  # 创建数据框df
df.index.name="index"  # 设置数据框索引列的名称

# 将数据框导出至Excel文件,指定工作表名和写入参数
df.to_excel("written_with_pandas1.xlsx", sheet_name="Output",
            startrow=1, startcol=1, index=True, header=True,  # 设置写入Excel时的起始行列位置和索引/表头选项
            na_rep="<NA>", inf_rep="<INF>")  #
            
with pd.ExcelWriter("written_with_pandas2.xlsx") as writer:  # 使用上下文管理器
  # 将数据框写入Sheet1工作表的第2行第2列位置
  df.to_excel(writer, sheet_name="Sheet1", startrow=1, startcol=1)
  # 将数据框再次写入Sheet1工作表的第11行位置
  df.to_excel(writer, sheet_name="Sheet1", startrow=10, startcol=1)
  df.to_excel(writer, sheet_name="Sheet2")  # 将数据框写入Excel文件

print(df)  # 输出数据框数据

任务复盘|平台实操:写入Excel文件

运行后核对:核对 datadfstartrowna_rep 是否按预测参与运算,实际输出是否与预测一致;若不一致,先检查类型、单位、索引/字段和运算顺序。

拓展练习:把输入表替换为本地中国上市公司数据的同结构子集;指出必须保持的字段、数据类型和质量检查。

to_excel 关键参数详解(一)

写入位置控制

  • startrow=1:数据从Excel第2行开始(第1行留给报告标题等)
  • startcol=1:数据从Excel第2列开始(第1列留给行号或其他标识)
  • index=True:是否写入行索引
  • header=True:是否写入列名

这种灵活性允许在一个Excel文件中创建复杂的报表布局。

to_excel 关键参数详解(二)

任务 参数 本例选择 检查含义
标出缺失值 na_rep '<NA>' 与真实空字符串区分
标出无穷值 inf_rep '<INF>' 避免误读为普通数值

下一步:导出后重新读取工作簿,逐列核对缺失值、无穷值、日期与布尔值是否仍保持预期语义。

ExcelWriter:上下文管理器模式

ExcelWriter 使用Python的上下文管理器(Context Manager):

with pd.ExcelWriter('file.xlsx') as writer:
    # 执行写入操作
    pass  # 此处留给学习者填写具体工作表写入语句
# 自动关闭文件,释放资源

核心优势:

  • 自动资源管理:退出上下文时调用关闭/保存流程并释放资源
  • 完整性边界:异常可能留下不完整或不可用文件,发布前必须重新读取并核对工作表、行数与关键单元格
  • 代码简洁:不需要显式调用 close() 方法

ExcelWriter:同一工作表多次写入

同一次 writer 会按 startrow/startcol 定位写入;区域重叠会覆盖单元格。默认 mode='w' 创建 writer 时还会覆盖同名工作簿:

with pd.ExcelWriter('report.xlsx') as writer:
    df.to_excel(writer, sheet_name='Sheet1', startrow=1)   # 第一块数据
    df.to_excel(writer, sheet_name='Sheet1', startrow=10)  # 第二块数据

这允许创建复杂的报表布局,例如:

  • 标题区 → 数据表1 → 空行 → 数据表2

ExcelWriter:多工作表管理

将不同类型的数据放在不同工作表:

  • Sheet1:原始数据
  • Sheet2:计算指标
  • Sheet3:图表数据

优势:数据分区清晰、可按工作表设置权限、大数据集分表提高加载速度。

to_excel vs ExcelWriter 对比

特性 to_excel ExcelWriter
单工作表 DataFrame.to_excel(path) DataFrame.to_excel(writer)
多工作表 需共享 writer writer 负责协调工作簿
同表多次写入 需共享 writer 并显式定位 重叠区域仍会覆盖
代码复杂度 简单 稍复杂
资源管理 自动 需用with语句

选择建议:简单导出用 to_excel,复杂报表用 ExcelWriter

实际应用场景

  • 财务报表导出:将计算好的财务指标导出为Excel,供检查使用
  • 交易报告生成:每日交易结束后,生成交易汇总报告
  • 数据存档:将处理后的历史数据保存为Excel,便于离线分析

大数据量处理策略

当处理大规模金融数据时(如百万级交易记录),需注意:

  • Excel行数限制:XLS格式65,536行;XLSX格式1,048,576行
  • 分批写入:将大数据集分成多个小文件
  • 数据聚合:先汇总再导出,减小文件体积
  • 格式选择:pandas 标准写入路线使用 XLSX/XLSM/ODS;XLSB 在 pandas 中是读取格式,若业务必须提供 XLSB,需采用并验证独立转换工具

CSV vs Excel:如何选择?

特性 CSV Excel
文件大小 小(纯文本) 大(包含格式)
读取速度
多工作表
格式化支持
跨平台兼容性 极好 需Excel

选择建议:数据备份/拓展应用 → CSV;向非技术人员展示 → Excel;大数据量 → CSV或数据库。

本节小结

  • to_excel() 是最基础的Excel导出方法,适合单表简单导出
  • ExcelWriter 支持多工作表、同表多次写入等高级功能
  • na_repinf_rep 参数处理特殊值的显示
  • startrowstartcol 控制写入位置,实现灵活布局
  • 大数据量场景需考虑Excel行数限制和性能优化

随堂练习

  • 问题 1|需要准备哪些数据?:待导出的明细表、汇总表和目标路径。
  • 问题 2|需要完成哪些操作?:按“ExcelWriter 上下文管理器”页一次写入多表并回读核验。
  • 问题 3|应得到哪些结果?:Excel 文件、工作表清单、行列数与关键单元格。
  • 问题 4|怎样确认结果可靠?:回读后比较字段、行数和关键值;目录不可写或覆盖风险未确认时先检查原因。
  • 问题 5|换一个情境,怎样继续应用?:把导出过程拓展应用到另一份课程练习文件。
  • 作答提示:请依次写清所用数据、分析过程、所得结果、核对方法和拓展思考。课程所需数据见前言中的下载入口;教学平台固定题按页面说明完成。

教师参考解答|答案与说明 1

  • 补充练习|ExcelWriter 上下文管理器

教师参考解答|代码 1

展开代码(代码区可独立滚动)
from io import BytesIO  # 使用内存文件避免外部副作用
import pandas as pd  # 导入表格处理库
workbook_buffer=BytesIO()  # 创建工作簿缓冲区
with pd.ExcelWriter(workbook_buffer,engine='openpyxl') as workbook_writer:  # 确保退出时完整保存
    pd.DataFrame({'value':[1.0,None]}).to_excel(workbook_writer,sheet_name='结果',index=False,na_rep='<NA>')  # 写入结果表
workbook_buffer.seek(0)  # 复位读取位置
print(pd.ExcelFile(workbook_buffer).sheet_names)  # 回读工作表目录

教师参考解答|答案与说明 2

  • 解释与拓展应用答案:Excel 适合人工审阅的多表提供,CSV 适合单表跨系统交换;长三角季度提供用回读行数、字段和哈希核对,不能只确认文件存在。

  • 所用数据与字段:导出表含数值与缺失标记

  • 参考代码或推导(平台保护块之外):

教师参考解答|代码 2

展开代码(代码区可独立滚动)
from io import BytesIO  # 使用内存文件避免写入外部路径
import pandas as pd  # 导入表格库
df=pd.DataFrame({'value':[1.0,None]})  # 创建输入
workbook_buffer=BytesIO()  # 创建工作簿缓冲区
df.to_excel(workbook_buffer,index=False,na_rep='<NA>',engine='openpyxl')  # 导出内存工作簿
workbook_buffer.seek(0)  # 将读取位置复位
check=pd.read_excel(workbook_buffer,keep_default_na=False)  # 回读验证
print(check.to_dict('records'))  # 输出回读记录

教师参考解答|答案与说明 3

  • 参考结果:两行;第二行保留可识别缺失标记
  • 边界 / 局限:空单元格不等于空字符串
  • 常见错误:只确认文件存在